package com.xinke.module.system.service.user;

import java.util.*;
import javax.validation.*;
import com.xinke.module.system.model.vo.user.*;
import com.xinke.module.system.model.entity.user.AdminUserDO;
import com.xinke.component.common.pojo.PageResult;
import com.xinke.component.common.pojo.PageParam;

/**
 * 用户信息 Service 接口
 *
 * @author yzx
 */
public interface AdminUserService {

    /**
     * 创建用户信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createAdminUser(@Valid AdminUserSaveReqVO createReqVO);

    /**
     * 更新用户信息
     *
     * @param updateReqVO 更新信息
     */
    void updateAdminUser(@Valid AdminUserSaveReqVO updateReqVO);

    /**
     * 删除用户信息
     *
     * @param userId 编号
     */
    void deleteAdminUser(Long userId);

    /**
     * 获得用户信息
     *
     * @param userId 编号
     * @return 用户信息
     */
    AdminUserDO getAdminUser(Long userId);

    /**
     * 获得用户信息分页
     *
     * @param pageReqVO 分页查询
     * @return 用户信息分页
     */
    PageResult<AdminUserDO> getAdminUserPage(AdminUserPageReqVO pageReqVO);
    /**
     * 通过用户名查询用户
     *
     * @param userName 用户名
     * @return 用户对象信息
     */
    AdminUserDO getUserByUsername(String userName);

    /**
     * 判断密码是否匹配
     *
     * @param rawPassword 未加密的密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 更新用户的最后登陆信息
     *
     * @param userId 用户编号
     * @param loginIp 登陆 IP
     */
    void updateUserLogin(Long userId, String loginIp);

    Long selectCount();

    AdminUserDO validateUserExists(Long userId);

    void validateUsernameUnique(Long userId, String userName);

    void validateMobileUnique(Long userId, String userPhone);

    void validateEmailUnique(Long userId, String userEmail);

    /**
     * 密码加密
     * @param userPassword
     * @return
     */
    String encodePassword(String userPassword);

    /**
     * 插入用户
     * @param user
     */
    AdminUserDO insertUser(AdminUserSaveReqVO user);
}